<!DOCTYPE HTML>
<html>
<head>
<title>OnClipboardChange | AutoHotkey v1</title>
<meta name="description" content="OnClipboardChange can be used in two different ways. As a function, it registers a function to be called automatically whenever the clipboard's content changes. As a label, it is launched automatically whenever the clipboard's content changes." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>OnClipboardChange</h1>
<p>OnClipboardChange 可以用作<a href="#function">函数</a>或<a href="#command">命令</a>, 但建议在新脚本中使用前者. 作为一个函数, 它注册一个函数, 以便在剪贴板的内容更改时自动调用该函数. 作为一个标签, 它在剪贴板的内容发生变化时自动启动.</p>

<h2 id="function">OnClipboardChange 函数 <span class="ver">[v1.1.20+]</span></h2>
<p>注册一个每当剪贴板内容发生改变时都会自动调用的<a href="../Functions.htm">函数</a>.</p>
<pre class="Syntax"><span class="func">OnClipboardChange</span>(Callback <span class="optional">, AddRemove</span>)</pre>

<h3 id="Parameters">参数</h3>
<dl>

  <dt id="Func">Callback</dt>
  <dd>
    <p>要调用的函数或<a href="../misc/Functor.htm">函数对象</a>的名称. 若要传递原义的函数名称, 将其括在双引号中.</p>
    <p>回调函数接受一个参数, 可以<a href="../Functions.htm#intro">定义</a>如下:</p>
    <pre class="NoIndent">MyCallback(DataType) { ...</pre>
    <p>虽然你给参数的名称并不重要, 但是下面的数字之一会赋值给它:</p>
    <ul>
      <li>0 = 剪贴板当前为空.</li>
      <li>1 = 剪贴板包含可以用文本形式表示的内容(包括从资源管理器窗口<a href="../misc/Clipboard.htm#CopiedFiles">复制的文件</a>).</li>
      <li>2 = 剪贴板包含完全是非文本的内容, 例如图片.</li>
    </ul>
    <p>如果不需要相应的信息, 可以省略回调的参数.</p>
    <p>如果这是最近的或仅有的回调, 其返回值会被忽略. 否则, 此回调会返回一个非零整数来阻止随后的回调被调用.</p>
  </dd>
  
  <dt>AddRemove</dt>
  <dd><p>如果省略, 则默认为 1. 否则, 请指定以下数字之一:</p>
    <ul>
      <li>1 = 在先前任意的注册回调之后调用该回调.</li>
      <li>-1 = 在先前任意的注册回调之前调用该回调.</li>
      <li>0 = 不调用该回调.</li>
    </ul>
  <p>如果存在 OnClipboardChange 标签, 它总是会被率先调用.</p></dd>

</dl>

<h2 id="label">OnClipboardChange 标签</h2>
<p class="warning"><strong>过时的:</strong> 不推荐在新脚本中使用 OnClipboardChange 标签. 请使用上面描述的 <a href="#function">OnClipboardChange</a> 函数代替.</p>
<p>当任何程序(甚至脚本本身) 改变了剪贴板内容时一个以 OnClipboardChange 命名的标签(如果存在) 会自动执行. 这个标签在脚本启动时也会执行一次.</p>
<p>内置变量 <strong>A_EventInfo</strong> 包含以下数值之一:<br>
<ul>
  <li>0 = 剪贴板当前为空.</li>
  <li>1 = 剪贴板包含可以用文本形式表示的内容(包括从资源管理器窗口<a href="../misc/Clipboard.htm#CopiedFiles">复制的文件</a>).</li>
  <li>2 = 剪贴板包含完全是非文本的内容, 例如图片.</li>
</ul>

<h2 id="Remarks">备注</h2>
<p>在回调或标签正在运行时, 如果剪贴板内容改变, 这时的剪贴板通知事件会丢失. 如果不希望这样, 请使用 <a href="Critical.htm">Critical</a>. 不过, 这样做也会缓冲/延迟在 OnClipboardChange 线程运行期间产生的其他<a href="../misc/Threads.htm">线程</a>的运行(例如热键的按击).</p>
<p>如果是脚本本身改变了剪贴板内容, 回调或标签通常不会立即执行; 也就是说, 紧接在改变剪贴板语句后面的语句就像提前运行了一样. 要强制立即执行这个回调或标签, 请在改变剪贴板内容后使用短暂的延迟, 例如 <code><a href="Sleep.htm">Sleep</a> 20</code>.</p>

<h2 id="Related">相关</h2>
<p><a href="../misc/Clipboard.htm">Clipboard</a>, <a href="OnExit.htm">OnExit</a>, <a href="OnMessage.htm">OnMessage()</a>, <a href="RegisterCallback.htm">RegisterCallback()</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExFnVsLabel">
<p><a class="ex_number" href="#ExFnVsLabel"></a> 函数 vs. 标签.</p>
<p>尽管语法不同, 但这两个例子都有相同的效果; 即, 用简短的 ToolTip 显示每次剪贴板的更改. 注意: 与标签不同, 回调不会在脚本第一次启动时运行一次, 而只在剪贴板的内容发生更改时运行一次.</p>
<pre id="FunctionExample">#Persistent
OnClipboardChange("ClipChanged")
return

ClipChanged(DataType) {
    ToolTip Clipboard data type: %DataType%
    Sleep 1000
    ToolTip  <em>; 关闭提示.</em>
}</pre>
<pre id="LabelExample">#Persistent
return

OnClipboardChange:
ToolTip Clipboard data type: %A_EventInfo%
Sleep 1000
ToolTip  <em>; 关闭提示.</em>
return</pre>
</div>

<div class="ex" id="ExFnObj">
<p><a class="ex_number" href="#ExFnObj"></a> 与上面相同, 但使用函数对象.</p>
<pre>#Persistent
OnClipboardChange(ClipChanged)
return

class ClipChanged {
    Call(DataType) {
        ToolTip Clipboard data type: %DataType%
        Sleep 1000
        ToolTip  <em>; 关闭提示.</em>
    }
}</pre>
</div>

</body>
</html>